/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Reportes.DAO;

import com.dp1.pucp.Modelo.Clases.Cliente;
import com.dp1.pucp.Modelo.Clases.Empleado;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Util.HibernateUtil;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
//import net.sf.jasperreports.engine.JasperFillManager;
//import net.sf.jasperreports.engine.JasperPrint;
//import net.sf.jasperreports.engine.JasperReport;
//import net.sf.jasperreports.engine.util.JRLoader;
//import net.sf.jasperreports.view.JasperViewer;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author pachon
 */
public class ReportesDAO {
    public static final String DRIVER = "org.postgresql.Driver";
    public static final String RUTA = "jdbc:postgresql://quilla.lab.inf.pucp.edu.pe:1043/postgres";
    public static final String USER = "postgres";
    public static final String PASSWORD = "intercambio";
    public static Connection CONEXION;
    
    public void generarReporteVenta(String archIN, String cli, Date fecIni, Date fecFin, String pro){
        JasperReport reporte;
        SimpleDateFormat fi = new SimpleDateFormat("yyyy-MM-dd");


        String params1 = "%" + cli.toUpperCase() + "%";
        String params2 = "%" + pro.toUpperCase() + "%";

        //Date fechita1 = new Date(fecIni.getTime());
        Date fechita1 = new Date();

        String date1 = fi.format(fecIni);
        String params3[] = date1.split("-");
        date1 = params3[0] + params3[1] + params3[2];


        SimpleDateFormat ff = new SimpleDateFormat("yyyy-MM-dd");
        Date fechita2 = new Date();

        String date2 = ff.format(fecFin);
        String params4[] = date2.split("-");
        date2 = params4[0] + params4[1] + params4[2];
        //fechita2 = ff.parse(date2);

        Map param = new HashMap();

        param.put("razonSocial", params1);
        param.put("producto", params2);
        param.put("fecIni", date1);
        param.put("fecFin", date2);
        try {
            Class.forName(DRIVER);
            CONEXION = DriverManager.getConnection(RUTA, USER, PASSWORD);
            URL in = this.getClass().getResource("reporteVentas.jasper");

            reporte = (JasperReport) (JRLoader.loadObject(in));
            
            
            JasperPrint jasperprint = JasperFillManager.fillReport(reporte, param, CONEXION);
            JasperViewer visor = new JasperViewer(jasperprint, false);
            visor.setTitle("Charlies - Reporte de Ventas" );
            visor.setVisible(true);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public void generarReporteKardex(String cli,String tprod){
        JasperReport reporte;
        Map param = new HashMap();
        String params1 = "%" + cli.toUpperCase() + "%";
        param.put("nombAlmacen", params1);
        param.put("tipoProd",tprod);
        try {
            Class.forName(DRIVER);
            CONEXION = DriverManager.getConnection(RUTA, USER, PASSWORD);
            URL in = this.getClass().getResource("reportKardex.jasper");

            reporte = (JasperReport) (JRLoader.loadObject(in));
            
            
            JasperPrint jasperprint = JasperFillManager.fillReport(reporte, param, CONEXION);
            JasperViewer visor = new JasperViewer(jasperprint, false);
            visor.setTitle("Charlies - Reporte de Kardex" );
            visor.setVisible(true);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public ArrayList<String> listarTipoProducto() {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("Materia Prima");
        estados.add("Producto Intermedio");
        estados.add("Producto Final");
        return estados;
    }
    
    public ArrayList<Tipoproducto> listarProductos(int i){
        String tp=null;
        if (i==1) {
            tp = "MP";
        }
        if (i==2){
            tp="PF";
        }
         ArrayList<Tipoproducto> listaResultados = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Tipoproducto where tipo= '" + tp + "' order by idtipoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Tipoproducto c = (Tipoproducto) iter.next();
                Hibernate.initialize(c.getIdtipoproducto());
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getTipo());
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
         
     }
    
    public ArrayList<Tipoproducto> listarProductos2(){
         ArrayList<Tipoproducto> listaResultados = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Tipoproducto order by idtipoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Tipoproducto c = (Tipoproducto) iter.next();
                Hibernate.initialize(c.getIdtipoproducto());
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getTipo());
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
         
     }
    
    public ArrayList<Cliente> listarClientes(){
         ArrayList<Cliente> listaResultados = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Cliente order by idcliente").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getIdcliente());
                Hibernate.initialize(c.getRazonsocial());
                Hibernate.initialize(c.getRuc());
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
         
     }
    
    public ArrayList<Empleado> listarUsuario(){
        
         ArrayList<Empleado> listaResultados = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Empleado where tipoempleado=2 ").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Empleado c = (Empleado) iter.next();
                Hibernate.initialize(c.getIdempleado());
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getApPaterno());
                Hibernate.initialize(c.getTipoempleado());
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
         
     }
    
    public void generarReporteLog(String cli){
        JasperReport reporte;
        Map param = new HashMap();
        String params1 = "%" + cli.toUpperCase() + "%";

        param.put("nombEmpleado", params1);
        
        try {
            Class.forName(DRIVER);
            CONEXION = DriverManager.getConnection(RUTA, USER, PASSWORD);
            URL in = this.getClass().getResource("reporteLOG.jasper");

            reporte = (JasperReport) (JRLoader.loadObject(in));
            
            
            JasperPrint jasperprint = JasperFillManager.fillReport(reporte, param, CONEXION);
            JasperViewer visor = new JasperViewer(jasperprint, false);
            visor.setTitle("Charlies - Reporte de LOG" );
            visor.setVisible(true);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public void generarReporteProducto(String pro){
        JasperReport reporte;
        Map param = new HashMap();

        param.put("producto", pro);
        
        try {
            Class.forName(DRIVER);
            CONEXION = DriverManager.getConnection(RUTA, USER, PASSWORD);
            URL in = this.getClass().getResource("matPrimaProducto.jasper");

            reporte = (JasperReport) (JRLoader.loadObject(in));
            
            
            JasperPrint jasperprint = JasperFillManager.fillReport(reporte, param, CONEXION);
            JasperViewer visor = new JasperViewer(jasperprint, false);
            visor.setTitle("Charlies - Reporte de Mat Prima por Proveedor" );
            visor.setVisible(true);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    
}
